package coneccion;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import mapeo.RolesMapper;
import objetos.Rol;
import objetos.Usuario;
import utils.UtilidadesConexion;

public class RolesConsultas {

	public RolesConsultas() {
		super();
	}
	
	public Rol getRolPorNombre(String nombreRol){
		Rol rol = null; 
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");		
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT roles_nombre, roles_descripcion ");
			query.append("FROM roles ");
			query.append("WHERE roles_nombre='").append(nombreRol).append("' ");
			rs = stmt.executeQuery(query.toString());
			
			RolesMapper rolesMapper = new RolesMapper();
			rol = rolesMapper.parseRol(rs);
		} catch (NamingException e) {
			e.printStackTrace();
			rol = new Rol();
		} catch (SQLException e) {
			e.printStackTrace();
			rol = new Rol();
		}catch (Exception e) {
			e.printStackTrace();
			rol = new Rol();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return rol;
	}
	
	public List<Rol> getTodosRol(){
		List<Rol> listaRol = null; 
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");		
		
		try {
			//creo la coneccion y la sentencia
			con = UtilidadesConexion.getConnectionFromTomcatPool();
			con.setAutoCommit(true);
			stmt = con.createStatement();
			
			//creo la consulta
			query.append("SELECT DISTINCT roles_nombre, roles_descripcion ");
			query.append("FROM roles ");
			
			rs = stmt.executeQuery(query.toString());
			
			RolesMapper rolesMapper = new RolesMapper();
			listaRol = rolesMapper.parseListaRol(rs);
		} catch (NamingException e) {
			e.printStackTrace();
			listaRol = new ArrayList<Rol>();
		} catch (SQLException e) {
			e.printStackTrace();
			listaRol = new ArrayList<Rol>();
		} catch (Exception e) {
			e.printStackTrace();
			listaRol = new ArrayList<Rol>();
		} finally {
			if (rs != null) {
			      try { 
			    	  rs.close(); 
			      } catch (SQLException e) {
			    	  
			      }
			      rs = null;
		    }
		    if (stmt != null) {
		      try { 
		    	  	stmt.close();
		    	  } catch (SQLException e) {
		    		  
		    	  }
		      stmt = null;
		    }
			if(con!=null){
				try {
					con.close();
				} catch (SQLException e) {
					
				}
				con = null;
			}
		}
		
		return listaRol;
	}
	
	
	public List<Rol> getRolesPorUsuario(Usuario usuario){
		List<Rol> listaRol = null; 
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		StringBuilder query = new StringBuilder("");		
		
		if(usuario!=null && usuario.getNombreUsuario()!=null && usuario.getNombreUsuario().length()>0){
			try {
				//creo la coneccion y la sentencia
				con = UtilidadesConexion.getConnectionFromTomcatPool();
				con.setAutoCommit(true);
				stmt = con.createStatement();
				
				//creo la consulta
				query.append("SELECT DISTINCT r.roles_nombre as roles_nombre, r.roles_descripcion as roles_descripcion ");
				query.append("FROM roles r, usuarios_roles ur, usuarios u ");
				query.append("WHERE r.roles_nombre=ur.roles_nombre AND ur.usuarios_nombre_usuario='")
					.append(usuario.getNombreUsuario()).append("' ");
				rs = stmt.executeQuery(query.toString());
				
				RolesMapper rolesMapper = new RolesMapper();
				listaRol = rolesMapper.parseListaRol(rs);
			} catch (NamingException e) {
				e.printStackTrace();
				listaRol = new ArrayList<Rol>();
			} catch (SQLException e) {
				e.printStackTrace();
				listaRol = new ArrayList<Rol>();
			} catch (Exception e) {
				e.printStackTrace();
				listaRol = new ArrayList<Rol>();
			} finally {
				if (rs != null) {
				      try { 
				    	  rs.close(); 
				      } catch (SQLException e) {
				    	  
				      }
				      rs = null;
			    }
			    if (stmt != null) {
			      try { 
			    	  	stmt.close();
			    	  } catch (SQLException e) {
			    		  
			    	  }
			      stmt = null;
			    }
				if(con!=null){
					try {
						con.close();
					} catch (SQLException e) {
						
					}
					con = null;
				}
			}
		}else{
			listaRol = new ArrayList<Rol>();
		}
		return listaRol;
	}
	
	/**
	 * El usuario debe contener la lista de roles
	 * @return
	 */
	public Boolean agregarRolesAUsuario(Usuario usuario){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = null;
		if(usuario!=null && usuario.getNombreUsuario()!=null && usuario.getNombreUsuario().length()>0 ){
			if(usuario.getNombreUsuario().equals("admin")){
				result = Boolean.TRUE;
			}else{
			
				try {
					//creo la coneccion y la sentencia
					con = UtilidadesConexion.getConnectionFromTomcatPool();
					stmt = con.createStatement();
					con.setAutoCommit(false);
					
					for(Rol rol:usuario.getRoles()){
						query = new StringBuilder("");
						query.append("INSERT INTO usuarios_roles (usuarios_nombre_usuario, roles_nombre)");
						query.append("VALUES ( ")
							.append("'").append(usuario.getNombreUsuario()).append("', ")
							.append("'").append(rol.getNombre()).append("' )");
						stmt.addBatch(query.toString());
					}
					//ejecuto el update
					stmt.executeBatch();
					con.commit();
					
					result = Boolean.TRUE;
					
				} catch (NamingException e) {
					e.printStackTrace();
					result = Boolean.FALSE;
				} catch (SQLException e) {
					e.printStackTrace();
					result = Boolean.FALSE;
				} catch(Exception e) {
					e.printStackTrace();
					result = Boolean.FALSE;
				}finally {
					
				    if (stmt != null) {
				      try { 
				    	  	stmt.close();
				    	  } catch (SQLException e) {
				    		  
				    	  }
				      stmt = null;
				    }
					if(con!=null){
						try {
							con.close();
						} catch (SQLException e) {
							
						}
						con = null;
					}
				}
			}
		}
		return result;
	}
	
	public Boolean eliminarRolesAUsuario(Usuario usuario){
		Boolean result = Boolean.FALSE;
		
		Connection con = null;
		Statement stmt = null;
		StringBuilder query = new StringBuilder("");
		if(usuario!=null && usuario.getNombreUsuario()!=null && usuario.getNombreUsuario().length()>0 ){
			if(usuario.getNombreUsuario().equals("admin")){
				result= Boolean.TRUE;
			}else{
			
				try {
					//creo la coneccion y la sentencia
					con = UtilidadesConexion.getConnectionFromTomcatPool();
					stmt = con.createStatement();
					con.setAutoCommit(true);
					
					query.append("DELETE FROM usuarios_roles ");
					query.append("WHERE usuarios_nombre_usuario='").append(usuario.getNombreUsuario()).append("'");
					//ejecuto el update
					stmt.executeUpdate(query.toString());
					
					result = Boolean.TRUE;
					
				} catch (NamingException e) {
					e.printStackTrace();
					result = Boolean.FALSE;
				} catch (SQLException e) {
					e.printStackTrace();
					result = Boolean.FALSE;
				} catch(Exception e) {
					e.printStackTrace();
					result = Boolean.FALSE;
				}finally {
					
				    if (stmt != null) {
				      try { 
				    	  	stmt.close();
				    	  } catch (SQLException e) {
				    		  
				    	  }
				      stmt = null;
				    }
					if(con!=null){
						try {
							con.close();
						} catch (SQLException e) {
							
						}
						con = null;
					}
				}
			}
		}
		return result;
	}
}
